#include "stm32f4xx.h"
#include "stm32can.h"
#include "canopen.h"

extern CO_Data slave_ObjDictData;


void HAL_CAN_RxFifo0MsgPendingCallback(CAN_HandleTypeDef *hcan)
{
    static CAN_RxHeaderTypeDef RxHeader;
    uint8_t RxData[8];
    Message Rx_Message;
    if (HAL_CAN_GetRxMessage(hcan, CAN_RX_FIFO0, &RxHeader, RxData) == HAL_OK)
    {
        // 你可以在这里对接收到的数据进行处理
        // 例如打印到串口、保存到缓冲区等
        
        // 示例：将接收到的数据打印到调试串口
        // printf("Received CAN Frame: ID=0x%X, DLC=%d, Data: ", RxHeader.StdId, RxHeader.DLC);
        //  for (int i = 0; i < RxHeader.DLC; i++) {
        //     TxData[i] = RxData[i];
        //  }
        Rx_Message.cob_id  = RxHeader.StdId;
        Rx_Message.rtr = (RxHeader.RTR == CAN_RTR_DATA) ? 0 : 1;	/* 标识符类型 */
        Rx_Message.len = RxHeader.DLC;
        memcpy(Rx_Message.data, RxData, RxHeader.DLC);		/* 数据 */
        // printf("\r\n");
        canDispatch(&slave_ObjDictData, &Rx_Message);
        // 将数据存入全局变量供主循环使用
        // 例如：global_rx_data = RxData;
    }
}

/* 功能:	CAN发送数据函数
	 参数:	notused can总线端口
			message canopen数据包
	返回值:	0 成功
			1 失败
 */


uint8_t canSend(CAN_PORT notused, Message *message)
{
	uint32_t i = 0xFFFFFF;
	CAN_TxHeaderTypeDef TxHeader;
    uint32_t TxMailbox;
	uint8_t TransmitMailbox = 0;
     uint8_t TxData[8] = {0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};

	/* 组装CAN数据包 */
	TxHeader.DLC = message->len;							/* 数据长度 */
	memcpy(TxData, message->data, message->len);	/* 数据 */
	TxHeader.IDE = CAN_ID_STD;								/* 标准ID */
    TxHeader.StdId = message->cob_id;	         /* 标识符 */
	TxHeader.RTR = (message->rtr == CAN_RTR_DATA) ? CAN_RTR_DATA : CAN_RTR_REMOTE;	/* 数据帧 */
        // 等待邮箱可用
    while (HAL_CAN_GetTxMailboxesFreeLevel(&hcan1) == 0) {
        // 可选：添加超时机制
    }

	/* 发送数据包 */
   uint8_t status= HAL_CAN_AddTxMessage(&hcan1, &TxHeader, TxData, &TxMailbox);
   // HAL_Delay(1); // 每秒发送一次
   if (status != HAL_OK)
    {
       Error_Handler();
       return 1;
    }
    return 0;
}
